perm filename BEAMS.OLD[NEW,LCS]3 blob
sn#319885 filedate 1977-12-14 generic text, type T, neo UTF8
00100 C***** BEAMS, XNOTE, BAUTO, UPDATE, SLEND, POSIT *******
00200 SUBROUTINE BEAMS
00300 INTEGER UPDN
00400 COMMON/XRN/RN(2000)
00500 COMMON/RINP/R(10,80),POSNT(0/99) /RMOD/RMODE2,SET4,IBEAM,
00600 1 NOSET,STEM,STUP,NTC,PS2,RAM,RDD,IT,POS
00700 1 /FRMT/F78F(1),FA1(1),FA5(1),IREAD /ALF/INP(72),ML
00800 1 /PTR/PWDS(250),ITEM,LL,IS,IX
00900 COMMON/SCM/V(78),I,LCNT,STAFF,LIST(200),REND
01000 COMMON R2,JAZ,CENTR,JBZ,RJQ(20),JQ(20) /STF/RSTFAC(8),RSTJ2
01100 COMMON/SCX/RHY(4),JALPHA(30),JX,U,JZ,IRHY,JD,KA,KB,IZ
01200 1 /SC/J,L,MK,ISKP,XMINUS,N,IEXP,LK,NNUM,JJ,JA,DBST,NFLG
01300 1 ,IXX,ISEMI,IQT,VX(50),IAMP,K,KN,M,MODE,IBLA
01400 DATA BX/25./,BY/.5/,DFAC/6./,CURV/0.9/
01500 C THESE ARE USED TO DETERMINE CURVE OF SLURS AT 63 (21700)
01600
01700 IF(RMODE.LT.500)GO TO 251
01800 IF(MODE.EQ.4)RETURN
01900 C PICKS UP SLURS ONLY WHEN USING SUBR. 'EXTRA' *********
02000 251 INVT=-1
02100 IF(MODE.EQ.3)GO TO 25
02200 IF(MODE.EQ.5)NTC=NTC-1
02300 C NTC=NUM OF NTS NOW
02400 IF(REND.NE.0)GO TO 25
02500 REND=3
02600 25 DO 1500 K=1,72
02700 IF(INP(K).EQ.'B')GO TO 22
02800 C B=AUTOMATIC BEAMS.
02900 IF(INP(K).NE.'*')GO TO 1500
03000 15 INP(72)='*'
03100 GO TO 500
03200 1500 IF(INP(K).EQ.ISEMI)GO TO 500
03300 GO TO 15
03400 C ABOVE FOR 2ND LNE OF INPUT. IF LNS ENDS WITHOUT * OR ;, IT PUTS IN *
03500 22 REREAD F78F,A,RB,RC
03600 C TYPE '2B' OR '3B' ETC. FOR AUTOMATIC BEAMS. (2=DUPLE 3=TRIPLE)
03700 IF(IREAD.NE.-1)GO TO 2222
03800 A=RB
03900 RB=RC
04000 C IREAD=-1 WHEN READING SOS FILES. (=-2 WITH ET FILES.)
04100 2222 A=A/2.
04200 C '2'=1 '3'=1.5 '2B 3;' MEANS THERE'S A 3 NOTE PICK-UP.
04300 IF(STEM)STEM=0
04400 C STEM=10 OR 20 IF ALREADY SETUP IN NOTES
04500 N=0
04600 J=0
04700 INP(72)='*'
04800
04900 GR=4./88.
05000 NN=0
05100 NZ=0
05200 NL=1
05300 NJ=0
05400 NR=1
05500 JV=0
05600 C JV IS VX COUNTER
05700 C=0
05800 B=A-.001
05900 IF(RB.EQ.0)GO TO 122
06000 J=RB
06100 C RB=NUM OF PICKUP ITEMS.*******(NTS AND RSTS - BUT NOT GRACE NTS.)*******
06200 B=-.001
06300 DO 222 K=1,J
06400 222 IF(V(K).NE.GR)B=B+ABS(V(K))
06500 C ABOVE FOUND VALUE OF PICKUPS
06600 122 X=ABS(V(NR))
06700 IF(X.NE.GR)GO TO 2122
06800 NN=NN+1
06900 GO TO 2022
07000 2122 C=C+X
07100 C ADD ON RHYTH VALUE -- IF NOT GRACE NOTES
07200 IF(V(NR))N=N+1
07300 C FINDS RESTS AND GRACE NOTES (WE SKIP THEM)
07400 IF(C.GT.B)GO TO 822
07500 CC IF(NOTAIL(X))NL=NR
07600 2022 IF(NR.EQ.IRHY)GO TO 422
07700 922 NR=NR+1
07800 C NR=RIGHT SIDE OF BEAM, NL=LEFT
07900 GO TO 122
08000 CC***822 IF(NR-NL-NN-N.GE.0)GO TO 322
08100 822 IF(NR-NL-NN-N.GT.0)GO TO 322
08200 C IGNORE IF ONLY ONE NOTE FILLS UNIT
08300 CC N=NN+N
08400 C UPDATE REST AND GRACE COUNTER
08500 722 IF(NR.EQ.IRHY)GO TO 422
08600 NN=0
08700 NJ=NJ+N
08800 NZ=NJ
08900 N=0
09000 NL=NR+1
09100 C PUSH AHEAD FOR NEXT BEAM
09200 622 B=B+A
09300 C UPDATE SPACE POINTER
09400 IF(C.GT.B)GO TO 622
09500 GO TO 922
09600
09700 322 KR=0
09800 NX=0
09900 2322 IF(V(NL).NE.GR)GO TO 3322
10000 C AVOIDS LEADING GRACE NOTES
10100 NL=NL+1
10200 GO TO 2322
10300 3322 K=NL
10400 DO 522 J=K,NR
10500 X=V(J)
10600 CC IF(X.GT.0)GO TO 1822
10700 IF(X)NX=NX+1
10800 C LOCAL COUNTER FOR RESTS.
10900 CC GO TO 1622
11000 1822 IF(NOTAIL(X))GO TO 6622
11100 C X≤ 10. 8. 8..
11200 IF(X.GE.0)KR=J-NX
11300 C RIGHT SIDE OF BEAM
11400 1622 IF(J.NE.NR)GO TO 522
11500 C ALWAYS STOP ON LAST OF GROUP
11600 6622 IF(KR.GT.NL)CALL BAUTO(JV,NL,KR,NZ)
11700 NZ=NZ+NX
11800 KR=0
11900 NX=0
12000 NL=J+1
12100 522 CONTINUE
12200 GO TO 722
12300 C MAIN AUTO BEAM LOOP ↑↑↑↑
12400
12500 C NEXT FOR BEAMED GRACE NOTES
12600 422 N=0
12700 J=1
12800 1122 X=V(J)
12900 IF(X)N=N+1
13000 NR=0
13100 IF(X.NE.GR)GO TO 1022
13200 NL=J
13300 DO 1222 K=J,IRHY
13400 X=V(K)
13500 IF(X.OR.X.NE.GR)GO TO 1322
13600 C STOPS GRACE NOTE BEAM AT REST OR NON-GRACE
13700 1222 NR=K
13800 1322 IF(NR-NL.LE.0)GO TO 1022
13900 CALL BAUTO(JV,NL,NR,N)
14000 C UPDATE VX COUNTER
14100 NL=NL+1
14200 J=NR
14300 1022 J=J+1
14400 IF(J.LE.IRHY)GO TO 1122
14500
14600 1422 IF(JV.EQ.0)RETURN
14700 C NO BEAMS - SO GO BACK.
14800 DO 2822 K=JV+1,50
14900 C USES ONLY 68 SLOTS IN 'V'
15000 2822 VX(K)=0
15100 J=0
15200 GO TO 511
15300
15400 C ******* 1ST MAIN LOOP *********
15500 500 REREAD F78F,VX
15600 J=0
15700 IF(IREAD.EQ.-1)J=1
15800 C SKIPS LINE #S IN SOS FILES. (=-2 IS FOR ET FILES.)
15900 511 J=J+1
16000 N=VX(J)
16100 JMP=1
16200 JREP=-1
16300 C JREP IS FOR REPEAT FEATURE IN 'MARKS'
16400 505 L=0
16500 K=0
16600 POS=-10.
16700 IF(MODE.EQ.3)GO TO 5032
16800 C MODE 3 IS FOR ACCENTS ETC.
16900 RN(8+IS)=0
17000 RN(9+IS)=0
17100 IT=0
17200 UPDN=0
17300 IF(MODE.EQ.5)GO TO 104
17400 IF(STEM.EQ.0)GO TO 503
17500 C UPDN=2=STEMS DOWN, (SLUR DIP UP) =1, OPPOSITE.
17600 104 JA=J+1
17700 B=VX(JA)
17800 C THE 2ND NOTE (-=DIP DOWN ALWAYS; +100=UP ALWAYS, ORD.=AUTOMATIC)
17900 IF(B.LT.100)GO TO 512
18000 UPDN=2
18100 B=B-100
18200 IF(B.GT.100)B=100-B
18300 C TYPE -NUM OR 200+NUM FOR DIP DOWN.
18400 512 IF(B)UPDN=1
18500 VX(JA)=B
18600 RN(9+IS)=0
18700 BRK=AMOD(VX(J),1.)*10.
18800 IF(BRK.EQ.0)GO TO 503
18900 C ADDS NUM TO BRACK. OR BEAM. ADD DESIRED .NUM TO 1ST NUM.(1.3=3)
19000 RN(9+IS)=BRK+.0001
19100 GO TO 5030
19200 503 IF(N.GT.0)GO TO 5031
19300 IT=-1
19400 C6/75 POS=-1.3
19500 CALL SLEND
19600 C -1= SLUR INTO 1ST NOTE.
19700 C SETS POS OF LFT SIDE (-10+9, THEN +2)
19800 GO TO 5060
19900 5031 IF(N.LE.NTC)GO TO 5030
20000 C NTC=NUM OF NTS
20100 C6/75 POS=202
20200 CALL SLEND
20300 C SLEND CHECKS ON END POINTS OF THIS STAFF
20400 GO TO 504
20500 C -1=1ST SLUR FROM NO NOTE; 99= LAST, TO NO NOTE
20600 5032 IF(N.GT.IRHY)N=IRHY
20700 C TRAPS ERROR OF TRYING TO PUT MARK ON NON-EXISTENT NOTE.
20800 5030 L=L+1
20900 502 K=K+1
21000 IF(R(1,K).NE.1.)GO TO 502
21100 C IS IT A NOTE?
21200 P=R(3,K)
21300 IF(P.EQ.POS)GO TO 502
21400 C SKIPS DBLSTPS
21500 POS=P
21600 506 IF(L.LT.N)GO TO 5030
21700 5060 IF(MODE.EQ.3)GO TO 30
21800 C NOW SLUR STARTS
21900 IF(JMP)GO TO 504
22000 C JMP=-1 MEANS END NOTE OF GROUP
22100 J=J+1
22200 NN=VX(J)
22300 C IF 2ND NUM IS .LE. 1ST , THEN 2-NOTE SLUR. (-1 GOES TO 1)
22400 IF(NN.EQ.0)NN=N+1
22500 IF(NN.EQ.0)NN=1
22600 IF(NN)GO TO 777
22700 IF(NN.LE.N)NN=N+1
22800 C FOR USE WITH AUTO-BEAMS OR DIP UP. 2-NOTE SLUR OR BEAM UP.
22900 777 IF(MODE.NE.4)GO TO 5061
23000 IF(STEM.LE.0)GO TO 5061
23100 C AUTOMATIC DIP DIRECTION FOR SLURS WITH AUTO. BEAMS.
23200 177 MK=K
23300 877 IF(R(1,MK).EQ.1)GO TO 477
23400 MK=MK+1
23500 GO TO 877
23600 C FOR SLUR INTO FIRST NOTE WITH AUTO BEAMS.
23700 477 IF(R(10,MK).EQ.0)GO TO 1077
23800 C SKIP NOTES ON ANOTHER STAFF.
23900 MK=MK+1
24000 GO TO 477
24100 1077 A=19.-R(5,MK)
24200 IF(NN.GE.0)GO TO 277
24300 IF(A.GT.0)GO TO 377
24400 277 IF(A.GE.0)GO TO 5061
24500 IF(NN.LE.0)GO TO 5061
24600 377 NN=-NN
24700 5061 MK=N
24800 N=IABS(NN)
24900 M=K
25000 JA=3
25100 JB=4
25200 KN=K
25300 RB=0
25400 IF(MODE.EQ.4)GO TO 550
25500 IBR=6
25600 C 6=SLUR, 7=BRACK. FOR TRIPLETS, ETC.
25700 CC*** NOT NEEDED NOW WITH UPDN FEATURE. IF(STEM.GE.0)NN=-NN
25800 IF(IT)GO TO 550
25900 C IT=-1=SLUR INTO 1ST NOTE.
26000 A=XNOTE(K)
26100 C XNOTE IS AMOD(R(4,K),100.)
26200 C SAVES LEVEL OF 1ST NOTE.
26300 504 RB=2
26400 CS B=AMOD(R(6,K),1.0)
26500 CS IF(B.GE.0.5)RB=3.
26600 CS IF(B.EQ.0.4)RB=5.
26700 C THESE ARE FOR >(.5) AND ∧(.4) ACCENTS
26800 IF(NN)RB=-RB
26900 C DIP IS SET BY PARAM 7. (STEM DIR. IS AUTOMATIC)
27000 550 RN(JA+IS)=POS
27100 B=XNOTE(K)
27200 IF(MODE.EQ.4)GO TO 519
27300 C TO MAKE MINI-BEAMS ON GRACE NOTES WHEN NEEDED.
27400 IF(MODE.NE.5)GO TO 513
27500 SLUR=0
27600 C A FLAG FOR LATER USE.
27700 MB=R(5,K)/10.
27800 IF(UPDN.EQ.0)GO TO 515
27900 IF(MB.EQ.0)MB=UPDN
28000 C MB=0 IF 2ND NOTE IS WITHOUT STEM
28100 IF(MB.EQ.UPDN)GO TO 515
28200 X=6
28300 IF(NN)X=-X
28400 CS IF(RB)X=-X
28500 RB=RB+X
28600 JA=3
28700 IF(JMP)JA=6
28800 IF(NN)GO TO 204
28900 CS IF(RB)GO TO 204
29000 IF(UPDN.EQ.2)GO TO 516
29100 204 IF(UPDN.EQ.1)GO TO 516
29200 C ABOVE FOR VARIOUS COMBINATIONS OF STEM DIRECTIONS
29300 RB=-RB
29400 NN=-NN
29500 516 IF(K.GT.1)GO TO 16
29600 IF(IT)GO TO 513
29700 16 IF(K.NE.NTC)GO TO 116
29800 IF(N.GT.NTC)GO TO 513
29900 C JUMP IF N=99, BY PASS IF K IS NOT LAST NOTE OF LINE.
30000 116 SLUR=1.
30100 IF(UPDN.EQ.1)SLUR=-SLUR
30200 SLUR=SLUR*RSTJ2
30300 RN(JA+IS)=RN(JA+IS)+SLUR
30400 C THIS NOT DONE IF SLUR TO FIRST NOTE
30500 GO TO 513
30600 519 SDIF=R(10,K)
30700 IF(SDIF.EQ.0)GO TO 513
30800 C JUMP IF IT'S NOT ON DIFF STF.
30900 RA=RSTJ2*2.44
31000 C NOTE WIDTH
31100 IF(ABS(R(4,K)).LT.80)GO TO 520
31200 RA=RA*.6
31300 IF(JMP)B=B-100
31400 C MINI
31500 520 IF(SDIF.EQ.2)RA=-RA
31600 C STAFF ABOVE
31700 RN(JA+IS)=POS+RA
31800 C ***** THIS CAN BE OFF A LITTLE IN SOME CASES!!******
31900 SDIF=SDIF*5
32000 IF(SDIF.NE.10)SDIF=20
32100 CHANGES 1 TO 20, 2 TO 10.
32200 GO TO 513
32300
32400
32500 517 IF(MB.EQ.1)GO TO 513
32600 IF(RB)RB=-RB
32700 GO TO 518
32800 515 UPDN=MB
32900 C AUTO SLUR DIP DEPENDS ON STEM DIREC. OF 1ST NOTE. (WHOLE NTS??)
33000 IF(NN)GO TO 517
33100 IF(MB.NE.1)GO TO 513
33200 RB=-RB
33300 518 NN=-NN
33400 513 RN(JB+IS)=B+RB
33500 C MK=# OF 1ST NOTE, N=END NOTE NOW
33600 JMP=-JMP
33700 IF(JMP.GT.0)GO TO 1503
33800 C GO FIND RT. SIDE OF SLUR
33900 JA=6
34000 JB=5
34100 IF(N.LE.MK)N=MK+1
34200 C PICKS UP TYPO ERRORS
34300 JK=0
34400 IF(R(7,K).GE.10)JK=-1
34500 C CHECKS FOR DOT AFTER 1ST NOTE -- FOR TIES.
34600 GO TO 503
34700
34800 1503 RN(2+IS)=STAFF
34900 IF(MODE.EQ.4)GO TO 35
35000 C NEXT TO SHIF SLUR IN RE. TO MARKS. STAC., TEN., ACC.
35100 C ***********KN = 1ST NOTE, K=LAST NOTE.********
35200 JA=KN
35300 JB=4
35400 2503 RB=R(2,JA)
35500 IF(RB.EQ.0)GO TO 3503
35600 IF(RB.EQ.4.OR.RB.EQ.5)GO TO 4503
35700 IF(RB.NE.7.AND.RB.NE.9)GO TO 3503
35800 RB=1.5
35900 IF(R(5,JA).LT.20)RB=-RB
36000 RN(IS+JB)=RN(IS+JB)+RB
36100 GO TO 3503
36200 4503 L=R(9,JA)
36300 C THE POINTER TO P11 WAS SAVED HERE BY 'NEWR'
36400 RN(L)=RN(L)+.2
36500 3503 IF(JA.EQ.K)GO TO 5503
36600 JA=K
36700 JB=JB+1
36800 GO TO 2503
36900
37000 5503 RN(8+IS)=-1
37100 RN(1+IS)=5
37200 IF(IT)RN(4+IS)=RN(5+IS)
37300 NN=-NN
37400 C IF NN IS NEG. NOW IT MEANS STEM DOWN.(DIP IS UP!)
37500 IF(MK.EQ.IRHY)GO TO 61
37600 IF(N.EQ.1)GO TO 61
37700 IF(IT)GO TO 60
37800 IF(XNOTE(K).NE.A)GO TO 60
37900 IF(N-MK.GT.1)GO TO 60
38000 CCC IF(R(5,M).NE.R(5,K))GO TO 65
38100 CCC FOR SLUR OVER CHROMATIC CHANGE ON SAME NOTE NAME.
38200 C M=1ST NOTE OF SLUR, K=LAST
38300 IF(AMOD(R(5,K),10.0).GT.0)GO TO 65
38400 C JUMP IF LAST NOTE AS ACCI.
38500 C JUMP IF NOT ADJACENT NOTE AT SAME PITCH AND NOT 1ST OR LAST.
38600 61 C=9
38700 IF(JK)C=12
38800 IF(RN(6+IS)-RN(3+IS)-C*RSTJ2)GO TO 65
38900 C JUMP IF SLUR IS VERY SHORT
39000 IF(IT)A=XNOTE(K)
39100 C IT=-1=SLUR INTO 1ST NOTE.
39200 A=A+.7
39300 IF(NN.GT.0)A=A-1.4
39400 C TO RAISE OR LOWER IT .5
39500 RN(4+IS)=A
39600 RN(5+IS)=A
39700 B=-2
39800 IF(JK)B=-3
39900 C JK=-1 WHEN NOTE IS DOTTED.
40000 C THIS PUTS TIE BETWEEN (NOT ABOVE OR BELOW) NTS. NO STEM CHNG.
40100 RN(8+IS)=B
40200 IF(SLUR.EQ.0)GO TO 65
40300 RN(3+IS)=RN(3+IS)-SLUR
40400 RN(6+IS)=RN(6+IS)-SLUR
40500 C PUSH SLUR BACK TO WHERE IT WAS
40600 GO TO 65
40700
40800 C** 6/16/75 60 IF(STEM.GE.0)GO TO 508
40900 60 IF(STEM.GE.0)GO TO 200
41000 IF(MODE.EQ.5)GO TO 200
41100 C JUMP IF SLURS**************
41200 C NEXT IS STEM INVERTER. SKIP IF AUTOMATIC BEAMS OR 'SU' 'SD' IN USE.
41300 JB=1
41400 RB=10.
41500 IF(NN)GO TO 509
41600 C IF NN IS NEG. NOW IT MEANS STEM DOWN.(DIP IS UP!)
41700 RB=-RB
41800 JB=2
41900 509 DO 507 L=M,K
42000 IF(R(1,L).NE.1.)GO TO 507
42100 JA=R(5,L)/10.
42200 IF(JA.NE.JB)GO TO 507
42300 IF(R(10,L).NE.0)GO TO 507
42400 C LEAVE NOTE ON OTHER STAFF ALONE.
42500 R(5,L)=R(5,L)+RB
42600 INVT=0
42700 C**********************************************
42800 507 CONTINUE
42900 GO TO 200
43000 62 IF(NN)GO TO 64
43100 IF(A.EQ.DMAX)GO TO 65
43200 AA=B-DMAX
43300 GO TO 63
43400 65 AA=0
43500 GO TO 63
43600 64 IF(A.EQ.UMAX)GO TO 65
43700 AA=UMAX-B
43800 63 RA=RN(6+IS)
43900 RB=RN(3+IS)
44000 X=CURV+(RA-RB)/BX+ABS(RN(4+IS)-RN(5+IS))/10.
44100 C CURVE DEPENDS ON LENGTH, TILT AND NOTES BETWEEN.
44200 IF(AA.GT.0)X=X+AA*BY
44300 IF(BRK.EQ.0)GO TO 66
44400 RN(8+IS)=1
44500 RN(3+IS)=RB-.6
44600 RB=R(3,K+1)
44700 C K=END NOTE OF GROUP
44800 IF(K.EQ.IZ)RB=200.
44900 C IZ IS LAST ITEM IN R(N,M)
45000 C**** IF(K.EQ.IRHY)RB=200.
45100 C ASSUMES LINE STOPS AT 200. (IT COULD BE LONGER!!)
45200 RN(6+IS)=RA+(RB-RA)/2.
45300 IBR=7
45400 C CHECK THESE NUMBERS↑↑↑↑
45500 B=RN(4+IS)
45600 BB=RN(5+IS)
45700 RA=1
45800 IF(A.LT.-1)RA=2.5
45900 C CHANGES HEIGHT. MAKES BRACK. IF N>100.
46000 IF(NN.GT.0)RA=-RA
46100 RN(4+IS)=B+RA
46200 RN(5+IS)=BB+RA
46300 X=2
46400 66 IF(NN.GT.0)X=-X
46500 510 RN(7+IS)=X
46600 IF(MODE.NE.4)GO TO 2514
46700 CC RN(9+IS)=0
46800 RN(10+IS)=0
46900 RN(IS+11)=-1
47000 CALL UPDATE(9)
47100 IF(JB)CALL BMX(RA)
47200 GO TO 514
47300 2514 L=IS
47400 CALL UPDATE(IBR)
47500 IF(M.EQ.K)GO TO 514
47600 C JUMP OUT IF INTERVENING NOTE.
47700 IF(RN(L+4).NE.RN(L+5))GO TO 514
47800 C IS IT LEVEL?
47900 B=-RN(IS-2)
48000 C CHANGE DIRECTION OF DIP AFTER FIRST SLUR.
48100 RA=1.4
48200 IF(RN(L+8).EQ.-1)RA=RA+1.3
48300 C IS TIE NOT BETWEEN NOTES?
48400 IF(NN.GT.0)RA=-RA
48500 C DIP DIRECTION. NN+ =DOWN, NN- =UP. REVERSED AFTER 1ST ONE.
48600 RA=XNOTE(M)+RA
48700 C=-2.
48800 IF(RN(L+8).EQ.-3.)C=-3.
48900 C PUT TIE BETWEEN NOTES ALWAYS.
49000 JA=M
49100 JB=K
49200 114 JA=JA+1
49300 JB=JB+1
49400 IF(R(3,JB).NE.POS)GO TO 514
49500 C JUMP IF RIGHT-HAND NOTE NOT IN SAME POS.
49600 IF(R(1,JA).NE.1)GO TO 514
49700 C CATCHES THINGS BETWEEN NOTES
49800 IF(R(4,JA).NE.R(4,JB))GO TO 514
49900 C LOOKS FOR PARALLEL CHORDS NOTES
50000 CRH IF(R(9,JA)+R(9,JB).NE.0)GO TO 514
50100 C MAKES SURE THEY ARE CHORD NOTES.
50200 A=XNOTE(JA)-RA+RN(L+5)
50300 RN(IS)=6.
50400 RN(IS+1)=5.
50500 RN(IS+2)=RN(IS-7)
50600 RN(IS+3)=RN(IS-6)
50700 RN(IS+6)=RN(IS-3)
50800 RN(IS+7)=B
50900 RN(IS+8)=C
51000 RN(IS+4)=A
51100 RN(IS+5)=A
51200 CALL UPDATE(IBR)
51300 GO TO 114
51400 514 J=J+1
51500 A=VX(J)
51600 N=A
51700 C SO ITEMS NEED NOT BE IN RIGHT ORDER.
51800 IF(MOD(N,100).GT.IRHY)A=0
51900 IF(A.NE.0)GO TO 505
52000 CC***USE NO NUMBS IN COMMENTS IN MODE 3-5****** IF(VX(J+2).EQ.0)GO TO 614
52100 IF(J.LT.50)GO TO 514
52200 C SOMETIMES A SLASH IS SEEN AS A 0 (WHEN PRECEDED BY SPACE).
52300 614 IF(INP(72).NE.'*')GO TO 552
52400 IF(INVT)RETURN
52500 INVT=IS
52600 CALL NEWR
52700 IS=INVT
52800 RETURN
52900 552 IF(IREAD.NE.0)GO TO 3501
53000 CALL TYPE
53100 WRITE(21,4501)INP
53200 GO TO 5501
53300 3501 IF(IREAD.EQ.-1)READ(22,2501)J,INP
53400 IF(IREAD.EQ.-2)READ(22,4501)INP
53500 CALL TYPOUT
53600 5501 CALL LNEND
53700 C FOR NEW 'SCORE' CONVENTIONS
53800 C TO READ MORE THAN 2 LINES.
53900 GO TO 25
54000 C FOR 2ND LINE.
54100 4501 FORMAT(72A1)
54200 2501 FORMAT(I,72A1)
54300
54400
54500 35 RA=10.
54600 C RA WILL=# OF TAILS, KN=1ST NOTE, K=LAST ('MOD' FOR DOTTED NOTES.)
54700 RN(1+IS)=6
54800 JMAX=0
54900 IF(N-MK.EQ.1)JMAX=-1
55000 DMAX=100.
55100 UMAX=-DMAX
55200 C FOR AUTO. BEAMS
55300
55400 JB=0
55500 MB=0
55600 C MB=-1 =GRACE NOTES UNDER BEAMS.
55700 IF(ABS(R(4,KN)).GE.80.)MB=-1
55800 DO 2 L=KN,K
55900 IF(R(1,L).NE.1)GO TO 2
56000 IF(R(10,L).NE.0)GO TO 2
56100 C SKIP NOTES ON ANOTHER STAFF.
56200 BB=R(5,L)
56300 IF(BB.GE.10.)GO TO 12
56400 UPDN=-1
56500 NN=19-AA
56600 CHORDS WILL HAVE FIXED STEM DIRECTIONS ALWAYS
56700 GO TO 2
56800 C SKIPS NON-NOTES AND DBLSTPS
56900 12 IF(MB)GO TO 10
57000 AA=BB
57100 RB=R(4,L)
57200 IF(ABS(RB).GE.80)GO TO 2
57300 C SKIPS GRACE NOTES
57400 GO TO 110
57500 10 RB=XNOTE(L)
57600 110 IF(RB.GT.UMAX)UMAX=RB
57700 IF(RB.LT.DMAX)DMAX=RB
57800 C FOR AUTO. BEAMS
57900 RB=AMOD(R(7,L),10.0)
58000 112 IF(RA.EQ.RB)GO TO 2
58100 JB=-1
58200 C FLAG FOR MIXED NUM. OF BEAMS
58300 IF(RB.GE.RA)GO TO 2
58400 IF(RB.NE.0)RA=RB
58500 2 CONTINUE
58600 C ABOVE FINDS SMALLEST # OF TAILS. NEXT FOR HGTS.
58700 C ABOVE IS POS.2
58800 IT=K
58900 C FOR EXTRA BEAMS WITH CHORDS. SAVE IT IN "IT"
59000 IF(STEM.GT.0)GO TO 577
59100 C *****↑↑↑↑↑↑ ABOVE WAS ".NE." BEFORE 4/30/76. WHY?#@&Xαε
59200 IF(UPDN.NE.0)GO TO 577
59300 IF(UMAX+DMAX.GE.14)NN=-1
59400 CXX IF(STEM.GT.0)NN=10.-STEM
59500 C SETS AUTO. BEAMS' STEM DIRECTION.
59600 577 X=10
59700 IF(NN)X=20
59800 IF(SDIF.NE.0)X=SDIF
59900 IF(MB)RA=2
60000 C 2 BEAMS ON GRACE NOTES ALWAYS
60100 X=X+RA
60200 C # OF BEAMS. IT'S PUT IN DOWN BELOW 550.
60300 200 M=KN
60400 207 L=M+1
60500 IF(R(1,L).NE.1)GO TO 307
60600 CC IF(R(9,L).NE.0)GO TO 307
60700 IF(R(5,L).GE.10)GO TO 307
60800 M=M+1
60900 GO TO 207
61000 C FOR HEIGHTS OF DBL STPS, ETC.
61100 307 IF(R(10,M).EQ.0)GO TO 607
61200 M=M+1
61300 C SKIP NOTES ON OTHER STAFF
61400 GO TO 307
61500 607 A=XNOTE(M)
61600 CW307 A=XNOTE(M)
61700 C A=NOTE 1.
61800 UMAX=A
61900 DMAX=A
62000 C UP MAX. NOTE #, DOWN MAX. NOTE #.
62100 407 M=K+1
62200 IF(R(1,M).NE.1)GO TO 103
62300 CC IF(R(9,M).NE.0)GO TO 103
62400 IF(R(5,M).GE.10)GO TO 103
62500 C FINDS DBL+ STP ON LAST OF BEAM
62600 K=M
62700 GO TO 407
62800 103 DO 3 M=KN,K
62900 IF(R(1,M).NE.1)GO TO 3
63000 IF(R(10,M).NE.0)GO TO 3
63100 C SKIP NOTES ON OTHER STAFF
63200 IF(M.EQ.K)GO TO 107
63300 CW IF(R(10,M).NE.0)GO TO 107
63400 IF(R(1,M+1).NE.1)GO TO 107
63500 C IT ONLY CARES ABOUT NOTES!
63600 CC IF(R(9,M+1).EQ.0)GO TO 3
63700 IF(R(5,M+1).LT.10)GO TO 3
63800 C IGNORE LOWER (OR UPPER) NOTES OF CHORDS (NO STEM)-IN RE. UP-DOWN FEATURE.
63900 107 IF(MB)GO TO 7
64000 C SKIP IF DEALING WITH GRACE NOTE BEAMS. (MB=-1)
64100 IF(ABS(R(4,M)).GE.100)GO TO 3
64200 C SKIPS NON-NOTES
64300 7 B=XNOTE(M)
64400 IF(MODE.EQ.5)GO TO 55
64500 677 IF(R(10,M).NE.0)GO TO 55
64600 C DON'T CHANGE STEM DIR. IF NOTE IS ON OTHER STAFF!!!!
64700 STMDR=R(5,M)
64800 IF(NN.GT.0)GO TO 5
64900 C JUMP IF STEM UP
65000 IF(STMDR.GE.20.)GO TO 55
65100 IF(STMDR.LT.10.)GO TO 55
65200 R(5,M)=STMDR+10.
65300 GO TO 551
65400 5 IF(STMDR.LT.20.)GO TO 55
65500 R(5,M)=STMDR-10.
65600 C************************
65700 C STEM UP
65800 551 INVT=0
65900 55 IF(B.LT.UMAX)GO TO 13
65910 CC55 IF(B.LE.UMAX)GO TO 13
66000 C ↑↑↑↑↑↑↑↑ WAS .LT. !!!!! 5/76
66100 UMAX=B
66200 IF(JMAX)GO TO 3
66300 IF(M.EQ.KN)GO TO 3
66400 IF(M.EQ.K)GO TO 3
66500 UMAX=UMAX+1
66600 GO TO 3
66700 13 IF(B.GT.DMAX)GO TO 3
66800 DMAX=B
66900 IF(JMAX)GO TO 3
67000 IF(M.EQ.KN)GO TO 3
67100 IF(M.EQ.K)GO TO 3
67200 DMAX=DMAX-1
67300 3 CONTINUE
67400 C LOOKS FOR LOWER AND HIGHER NOTES THAN NOTE 1.
67500 4 IF(MODE.EQ.5)GO TO 62
67600 K=IT
67700 C FOR EXTRA BEAMS WITH CHORDS. K WAS SAVED IN "IT"
67800 AA=A
67900 BB=B
68000 C=1
68100 IF(X.LT.20.)GO TO 48
68200 C JUMP IF STEM IS UP
68300 CALL EXCH(AA,BB)
68400 C=-C
68500 CALL EXCH(UMAX,DMAX)
68600 48 IF(AA.LT.BB)GO TO 45
68700 IF(UMAX.EQ.A)GO TO 46
68800 47 A=UMAX-C
68900 B=A
69000 GO TO 444
69100 46 IF(UMAX.GT.AA)GO TO 47
69200 GO TO 49
69300 45 IF(UMAX.NE.B)GO TO 47
69400 49 A=AA
69500 B=BB
69600 IF(X.GE.20)CALL EXCH(A,B)
69700
69800 444 RN(2+IS)=STAFF
69900 446 DIS=(RN(IS+6)-RN(IS+3))/DFAC
70000 C FOR TILT LATER -- DFAC IS IN DATA
70100 IF(ABS(A-B).LT.DIS)GO TO 143
70200 C=C*DIS
70300 C NEW TILT ROUTINE. CONSIDERS DISTANCE:HEIGHT
70400 C LIMITS SLOPE OF BEAM
70500 IF(X.GE.20)GO TO 141
70600 IF(B.GT.A)GO TO 140
70700 142 B=A-C
70800 GO TO 143
70900 141 IF(B.GT.A)GO TO 142
71000 140 A=B-C
71100
71200 143 BB=A
71300 IF(STMDR.GE.20)GO TO 530
71400 IF(B.LT.A)BB=B
71500 C BB IS LOWEST SIDE OF BEAM
71600 IF(BB.GE.0)GO TO 14
71800 C BEAM WILL ALWAYS TOUCH MIDDLE LINE OF STAFF
71900 BB=-BB
71950 GO TO 430
72500 530 IF(B.GT.A)BB=B
72600 C FOR STEMS DOWN
72800 IF(BB.LE.14)GO TO 14
72900 C BEAMS WILL ALWAYS TOUCH MIDDLE LINE OF STAFF
73000 BB=14-BB
73100 430 A=A+BB
73133 B=B+BB
73166 C GETS NEW HEIGHT NUMBERS.
73200
73300 14 IF(MB.EQ.0)GO TO 330
73400 C NEXT FOR GRACE NOTE BEAMS (MB=-1)
73500 C=100
73600 IF(A)C=-C
73700 A=A+C
73800 330 RN(4+IS)=A
73900 RN(5+IS)=B
74000 C MAKES HORIZONTAL BEAMS IF PATTERN IS UP-DOWN.
74100 C*******?????? RN(6+IS)=R(3,K)
74200 C ABOVE IS POS.2
74300 GO TO 510
74400
74500 C NEXT IS FOR ACCENTS AND OTHER MARKS
74600
74700 30 IF(JREP)CALL MARKS(RA)
74800 RB=0
74900 C%%%%%%%%
75000 J=J+1
75100 IF(RA.GE.30.AND.RA.LE.35)VX(J+1)=0
75200 C THIS ↑↑↑↑ CATCHES FINGERING NUM.(0-5) IT WAS READ IN MARKS.
75300 IF(RA.EQ.99)RA=VX(J)
75400 C IF STEM IS DOWN OR THERE ARE NOTES BELOW(DBL STP), POSITION
75500 C OF ACCENT WILL BE INVERTED.
75600 130 IF(RA.LT.37)GO TO 304
75700 C 37=RIT.
75800 NN=6
75900 BB=-6
76000 A=3
76100 B=3
76200 IF(XNOTE(K).LT.3)BB=XNOTE(K)-7.5
76300 C LOWERS ITEM IF NOTE BELOW STAFF. BUT IS 'K' ALWAYS OK HERE??????
76400 IF(RA.LT.99)GO TO 305
76500 C NEXT FOR CRESC. & DECRSC. LINES<,>. TYPE /NT1 C+ NT2/ OR /N1.d C- N2.d/
76600 C ALSO FOR "8va ----" /NT1 O NT2/
76700 NN=8
76800 BB=BB+2.5
76900 A=5
77000 B=4
77100 RB=50
77200 IF(RA.NE.208)GO TO 306
77300 RB=0
77400 B=7
77500 BB=15
77600 C LATER ADD CHECK FOR HEIGHT OF NOTES UNDER 8va.
77700 306 RN(IS+7)=RA-200
77800 C MAKES ZERO OR -1 OR 8 IN P7
77900 RA=RB
78000 C ADDS A NEW ITEM. MP, PP, CRESC., ETC. --CODE 3
78100 305 RN(IS)=A
78200 RN(IS+1)=B
78300 RN(IS+2)=STAFF
78400 C PUTS MF, ETC. BETWEEN NOTES. (I HOPE) SEE 'FUNCTION POSIT' BELOW
78500 RN(IS+3)=POSIT(VX(J-1))-1.5
78600 C '-1.5' PUSHES IT TO LEFT. MAYBE CHANGE ORIGINAL POSITIONS??
78700 RN(IS+4)=BB
78800 C DIST. BELOW STAFF
78900 RN(IS+5)=RA
79000 C THE CODE NUM IN 'CLEFS' LIST
79100 IS=IS+NN
79200 IF(NN.EQ.6)GO TO 230
79300 J=J+1
79400 RA=POSIT(VX(J))
79500 IF(RB.EQ.0)RA=RA+3
79600 C RB=0= 8va
79700 RN(IS-2)=RA
79800 C THIS IS P6 (POS2 FOR CRESC. LINES)
79900 GO TO 514
80000 CS304 RB=R(6,K)
80100 CS B=10.
80200 CS IF(RA.EQ.6)RA=26.
80300 C TEMPORARY CHANGE FOR FERMATA*******
80400 CS IF(RA.GT.10.)RA=RA/10.
80500 CS A=ABS(AMOD(RB,1.))
80600 CS IF(A.EQ.0)GO TO 301
80700 CS IF(RA.GT.3)GO TO 303
80800 CS RB=FLOAT(IFIX(RB))
80900 CS RA=RA+A/10.
81000 C THIS PUTS 2-DIGIT CODE BEFORE 1-DIGIT CODE.
81100 CS GO TO 301
81200 CS303 IF(A.LT..3)GO TO 302
81300 CS B=100.
81400 CS GO TO 301
81500 CS302 B=1000.
81600 CS301 IF(RB.LT.0)RA=-RA
81700 CS R(6,K)=RB+RA/B
81800 304 RB=R(2,K)
81900 IF(RA.EQ.6)RA=26.
82000 A=RA
82100 IF(RB.EQ.0)GO TO 301
82200 IF(RB.GE.10)GO TO 303
82300 A=A*100
82400 GO TO 301
82500 303 RB=RB*100
82600 301 R(2,K)=RB+A
82700 C P11 INFO(MARKS) IS TEMPORARILY STORED IN P2 (STAFF# IS IN STAFF)
82800 230 A=VX(J)
82900 JREP=-1
83000 IF(A.EQ.0)GO TO 514
83100 C NEXT FOR STRING OF SAME MARK ( /3 12 S/ )
83200 JREP=0
83300 J=J-1
83400 VX(J)=VX(J)+1
83500 IF(VX(J).GE.A)VX(J+1)=0
83600 J=J-1
83700 GO TO 514
83800 C USES 4-7,9,11-13 FOR ACC. > FERM. DOT - DNBOW UPBOW HARM.
83900 C NOTE#,ACCENT#/N,A/N,A*
84000 END
84100
84200 CF FUNCTION XNOTE(J)
84300 CF COMMON/XRN/RN(4000)
84400 CF DIMENSION R(10,80)
84500 CF EQUIVALENCE (R,RN(3001))
84600 CF XNOTE=AMOD(R(4,J),100.)
84700 CF END
84800
84900 CF SUBROUTINE BAUTO(J,L,K,N)
85000 C FOR AUTOMATIC BEAMS.
85100 CF COMMON/SCM/V(78),I,LCNT,STAFF,LIST(200),REND
85200 CF J=J+2
85300 CF V(J-1)=L-N
85400 CF V(J)=K-N
85500 CF END
85600
85700 CF SUBROUTINE UPDATE(I)
85800 CF COMMON /PTR/PWDS(250),ITEM,LL,IS,IX /XRN/RN(4000)
85900 CF RN(IS)=I
86000 CF IS=IS+I+3
86100 CF END
86200
86300 C SUBROUTINE SLEND
86400 C INTEGER PWDS
86500 C TO FIND END POINTS OF STAVES
86600 C COMMON/XRN/RN(2000),IT,POS,RA,NN,JB,RB,A,B,JMP,JK,C,DMAX,
86700 C 1 UMAX,AA,JMAX,X,Y,BB,RNX(1982)
86800 1/SCM/V(78),I,LCNT,STAFF,LIST(200),REND/PTR/PWDS(250),ITEM,LL,IS,IX
86900 C DO 1 K=1,ITEM
87000 C L=PWDS(K)
87100 C IF(RN(L+1).NE.8)GO TO 1
87200 C FOUND A STAFF
87300 C IF(RN(L+2).NE.STAFF)GO TO 1
87400 C GOT THE RIGHT ONE
87500 C IF(IT)GO TO 2
87600 C POS=202
87700 C NOW CHECK LEFT SIDE OF STAFF
87800 C IF(RN(L).LT.4)RETURN
87900 C P6 WASN'T MENTIONED - SO IT =200
88000 C POS=RN(L+6)+2
88100 C IF(POS.EQ.2)POS=202
88200 C RETURN
88300 C2 POS=RN(L+3)-2.3
88400 C RETURN
88500 C1 CONTINUE
88600 C END
88700
88800 C FUNCTION POSIT(V)
88900 C COMMON/XRN/RN(4000)
89000 C DIMENSION POSNT(0/82)
89100 C EQUIVALENCE (POSNT,RN(3801))
89200 C 1,(A,RN(3884)),(K,RN(3885))
89300 C IF(V)V=-V
89400 C REREAD OR SOMETHING MAKES /1 C- 2/ GIVE A -2 FOR LAST NUM.!!!???
89500 C K=V
89600 C A=POSNT(K)
89700 C POSIT=A+(POSNT(K+1)-A)*AMOD(V,1.0)
89800 C TYPE /2.3 -- FOR POSITION BETWEEN NTS 2 AND 3. ETC.
89900 C END